Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Introduce Conftest
Search
yuhara
September 08, 2020
Technology
570
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Introduce Conftest
yuhara
September 08, 2020
More Decks by yuhara
See All by yuhara
managed_Kubernetes_on-premises.pdf
yuhara
1
920
Other Decks in Technology
See All in Technology
The seven pitfalls of AI (revised version)
ufried
0
230
Databricksメトリクスビューはじめてのもくもく会
taka_aki
0
180
1万名の社員が使う認証基盤で どう信頼性を担保するか?
kairim0
0
180
AI駆動開発、viviONの1年 ── うまくいったこと・いかなかったこと
vivion
0
150
Lambda MicroVMsが分からなすぎたので使い所を1から考えてみた
tsukuboshi
2
320
KanaAI
shreyas1009
0
140
[2026 Oracle Technical Deep Dive] オンプレミスDBのCloud移行アプローチ:移行計画に基づくメソッドとツールの選択 (2026年9月17日開催)
oracle4engineer
PRO
0
110
OpenClawでAzure DevOpsのWiki更新を自動化する - クラウドAIだけでは届かない場所へ
yutakaosada
0
150
[2026 Oracle Technical Deep Dive] エンタープライズAIエージェントを支えるOCIソリューション。ラインナップと特徴を理解しよう! (2026年9月17日開催)
oracle4engineer
PRO
0
320
Snowflake Horizon Catalog と Apache Iceberg で作る オープンなデータ基盤
kitagawaz
0
400
組み立てて楽しむ AWS Blocks 入門
kmiya84377
0
170
人にやさしく、AIにやさしく、書き手を選ばないIaCのガードレール再考 / Rethinking IaC Guardrails for Humans and AI Alike
kohbis
6
2.1k
Featured
See All Featured
Claude Code のすすめ
schroneko
67
230k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
510
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
260
Designing for Timeless Needs
cassininazir
1
510
Java REST API Framework Comparison - PWX 2021
mraible
34
9.7k
Building Flexible Design Systems
yeseniaperezcruz
330
41k
GitHub's CSS Performance
jonrohan
1033
470k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Un-Boring Meetings
codingconduct
0
440
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
480
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
840
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
720
Transcript
CloudNative Days Tokyo 2020 RegoによるOPAポリシーの開発と Conftestを活用したポリシーチェックの実現 Merpay
SRE Takaaki Yuhara
Agenda Conftest利用の背景 Regoで記述したポリシーとConftestの活用 ポリシーの開発とテスト 01 02 03
Conftest利用の背景 Regoで記述したポリシーとConftestの活用 ポリシーの開発とテスト 01 02 03
メルペイのシステム概要 • マイクロサービスアーキテクチャ • Google Cloud Platform(GCP)を利用 • アプリケーションはKubernetes上で稼働 •
マイクロサービスはそれぞれ下記が割り当てられる ◦ GCP Project ◦ Kubernetes Namespace
構成とフローの概略図 Kubernetes Project Project A Project B Service A Team
Service B Team Repository(GCP) Namespace A Namespace B Repository(k8s) Cloud Spanner Cloud Spanner Cloud Pub/Sub BigQuery Kubernetes Cluster CircleCI YAML HCL (Terraform)
Production Readiness Checklist • サービスを安全にリリースするためのチェックリスト • マイクロサービスのリリース前にチェックを行う • 例) ◦
Kubernetes ▪ CPUやMemoryのrequestsとlimits ▪ preStop ▪ livenessProbe / readinessProbe ▪ runAsNonRoot ▪ HorizontalPodAutoscaler ▪ PodDisruptionBudget ◦ GCP ▪ Databaseのバックアップ ▪ Cloud StorageのObject Lifecycle Management
Open Policy Agent(OPA) https://www.openpolicyagent.org/docs/latest/ • OSSの汎用ポリシーエンジン • CNCFのincubatingのプロジェクト • Regoというポリシー記述言語で
ポリシーを書く • ポリシーと入力されたデータを評価し結 果を返す
Gatekeeper • Gatekeeper ◦ OPAをKubernetes上で使えるよう にしたもの ◦ KubernetesのAdmission Controllerと連携してOPAを利用 ◦
Webhook先をOPAにすることで API Server側でポリシーチェック https://www.openpolicyagent.org/docs/latest/kubernetes-introduction/
Gatekeeper • ConstraintTemplateとConstraint というCRDでポリシーを定義 • Regoによるポリシーは ConstraintTemplate内に記述 https://github.com/open-policy-agent/gatekeeper
Conftest • Regoで記述したポリシーと入力データをコマンドラインで検証するツール • CI上で使われることを想定している • リモートにあるRegoのポリシーを利用できる • 様々なフォーマットに対応 ❏
YAML ❏ JSON ❏ INI ❏ TOML ❏ HOCON ❏ HCL ❏ HCL1 ❏ CUE ❏ Dockerfile ❏ EDN ❏ VCL ❏ XML ❏ Jsonnet
なぜConftestを使い始めたか • もともとCIでterraform planやkubectl validate/dry-runでの失敗を通知していて、ポ リシーチェックも導入しやすかった • Conftestが様々なフォーマットに対応している ◦ GCPのクラウドリソースはHCL形式のTerraformで管理
◦ KubernetesのマニフェストはYAMLで管理 • KubernetesではRegoで記述したポリシーをCIとAPI Server側で両側面でチェックで きる ◦ CI時のチェックはConftest ◦ API Server側でのチェックはGatekeeper
Conftest利用の背景 Regoで記述したポリシーとConftestの活用 ポリシーの開発とテスト 01 02 03
テストシナリオ • 例)HorizontalPodAutoscalerのspec.minReplicasが3以上であること apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscaler metadata: name: php-apache
spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: php-apache minReplicas: 3 maxReplicas: 10 metrics: - type: Resource resource: <以下、省略> minReplicasが省略されていたり、 値が3未満の場合は事前に気付きたい
Regoでポリシーを記述 package hpa description := "This is production readiness check
itme, please check http://~" violation_min_replicas_is_not_set[{"msg": msg, "description": description}] { input.kind = "HorizontalPodAutoscaler" satisfied := [good | good := input.spec.minReplicas >= 3] not any(satisfied) msg := sprintf("minReplicas in HorizontalPodAutoscaler %s must be set", [input.metadata.name]) } • 例)HorizontalPodAutoscalerのspec.minReplicasが3以上であること
Regoでポリシーを記述 package hpa description := "This is production readiness check
itme, please check http://~" violation_min_replicas_is_not_set[{"msg": msg, "description": description}] { input.kind = "HorizontalPodAutoscaler" satisfied := [good | good := input.spec.minReplicas >= 3] not any(satisfied) msg := sprintf("minReplicas in HorizontalPodAutoscaler %s must be set", [input.metadata.name]) } package名は任意。
Regoでポリシーを記述 package hpa description := "This is production readiness check
itme, please check http://~" violation_min_replicas_is_not_set[{"msg": msg, "description": description}] { input.kind = "HorizontalPodAutoscaler" satisfied := [good | good := input.spec.minReplicas >= 3] not any(satisfied) msg := sprintf("minReplicas in HorizontalPodAutoscaler %s must be set", [input.metadata.name]) } ルール名は deny, violation, warn を使うことができる。 deny, violationではルールに合致するとExit codeが1, warnではルールに合致してもExit codeが0 ルール名をviolation_xxxなどのように指定してもOK
デバッグ時の出力 内部でdata.<package名>.<ルール名> という形で扱われているためルール名を分けておくと便利
Regoでポリシーを記述 package hpa description := "This is production readiness check
itme, please check http://~" violation_min_replicas_is_not_set[{"msg": msg, "description": description}] { input.kind = "HorizontalPodAutoscaler" satisfied := [good | good := input.spec.minReplicas >= 3] not any(satisfied) msg := sprintf("minReplicas in HorizontalPodAutoscaler %s must be set", [input.metadata.name]) } ルールに合致した場合に返す値
Regoでポリシーを記述 package hpa description := "This is production readiness check
itme, please check http://~" violation_min_replicas_is_not_set[{"msg": msg, "description": description}] { input.kind = "HorizontalPodAutoscaler" satisfied := [good | good := input.spec.minReplicas >= 3] not any(satisfied) msg := sprintf("minReplicas in HorizontalPodAutoscaler %s must be set", [input.metadata.name]) } 入力データ(input)のkindがHorizontalPodAutoscalerであるか評価 (Gatekeeperでは入力データが input.review.objectなのでConftestとGatekeeper両方でポリシーを使う場合は入 力データを評価するような判定を入れると良い)
Regoでポリシーを記述 package hpa description := "This is production readiness check
itme, please check http://~" violation_min_replicas_is_not_set[{"msg": msg, "description": description}] { input.kind = "HorizontalPodAutoscaler" satisfied := [good | good := input.spec.minReplicas >= 3] not any(satisfied) msg := sprintf("minReplicas in HorizontalPodAutoscaler %s must be set", [input.metadata.name]) } input.spec.minReplicas が3以上であればgoodという変数にtrueが代入。3未満ならfalseが代入される。
Regoでポリシーを記述 package hpa description := "This is production readiness check
itme, please check http://~" violation_min_replicas_is_not_set[{"msg": msg, "description": description}] { input.kind = "HorizontalPodAutoscaler" satisfied := [good | good := input.spec.minReplicas >= 3] not any(satisfied) msg := sprintf("minReplicas in HorizontalPodAutoscaler %s must be set", [input.metadata.name]) } パイプの左のgoodという変数に値を渡しています。つまりsatisfiedは要素が1つのarrayとなります。ただし minReplicasが省略されている場合はgoodが空なのでsatisfiedは要素が0のarrayです。 satisfied minReplicasが3以上 [true] minReplicasが3未満 [false] minReplicasが省略 []
Regoでポリシーを記述 package hpa description := "This is production readiness check
itme, please check http://~" violation_min_replicas_is_not_set[{"msg": msg, "description": description}] { input.kind = "HorizontalPodAutoscaler" satisfied := [good | good := input.spec.minReplicas >= 3] not any(satisfied) msg := sprintf("minReplicas in HorizontalPodAutoscaler %s must be set", [input.metadata.name]) } any関数でsatisfied内に1つでもtrueがある場合はtrueとなる。 satisfied any(satisfied) minReplicasが3以上 [true] true minReplicasが3未満 [false] false minReplicasが省略 [] false
Regoでポリシーを記述 package hpa description := "This is production readiness check
itme, please check http://~" violation_min_replicas_is_not_set[{"msg": msg, "description": description}] { input.kind = "HorizontalPodAutoscaler" satisfied := [good | good := input.spec.minReplicas >= 3] not any(satisfied) msg := sprintf("minReplicas in HorizontalPodAutoscaler %s must be set", [input.metadata.name]) } spec.minReplicasが3以上でない場合を条件として合致させたいため、否定のnotを使用 satisfied any(satisfied) not any(satisfied) minReplicasが3以上 [true] true false minReplicasが3未満 [false] false true minReplicasが省略 [] false true
Regoでポリシーを記述 package hpa description := "This is production readiness check
itme, please check http://~" violation_min_replicas_is_not_set[{"msg": msg, "description": description}] { input.kind = "HorizontalPodAutoscaler" satisfied := [good | good := input.spec.minReplicas >= 3] not any(satisfied) msg := sprintf("minReplicas in HorizontalPodAutoscaler %s must be set", [input.metadata.name]) } 最後にmsgを生成
コマンド実行時の出力(JSON) [ { "filename": "sample-hpa.yaml", "warnings": [], "failures": [ {
"msg": "minReplicas in HorizontalPodAutoscaler sample must be set", "metadata": { "description": "This is a production readiness check item, please check https://~" } } ], "successes": [] } ] $ conftest test --policy policy/hpa --namespace hpa --input yaml --output json sample-hpa.yaml ConftestをCIに組み込んで、 適切な情報をディベロッパーにフィードバック
Agenda Conftest利用の背景 Regoで記述したポリシーとConftestの活用 ポリシーの開発とテスト 01 02 03
ポリシーの開発とテスト • OPAではポリシーをコードで開発、運用できる(Policy as Code) • Regoのポリシーをテストするフレームワークがある • テスト用のルールはtest_xxxとする •
withキーワードを使って入力データをMockのデータに置き換えできる package hpa msg := "minReplicas in HorizontalPodAutoscaler sample must be set" test_min_replicas_less_than_three { violation_min_replicas_is_not_set[{"msg": msg, "description": description}] with input as { "kind": "HorizontalPodAutoscaler", "metadata": {"name": "php-apache"}, "spec": {"maxReplicas": 10, "minReplicas": 1} } }
テスト実行 • opa testコマンドを使ってテストを実行 • --coverage --format=jsonオプションをつけるとカバレッジも報告される $ opa test
-v hpa.rego hpa_test.rego data.hpa.test_min_replicas_less_than_three: PASS (2.977518ms) -------------------------------------------------------------------------------- PASS: 1/1 $ opa test --coverage --format=json hpa.rego hpa_test.rego | jq .coverage 60
まとめ • Production Readiness Checklistを適切にチェックし安全にリリースするためにOpen Policy AgentのConftestを利用し始めた • KubernetesのYAML manifestやTerraformのHCL等をCIでチェック
• Regoで記述したポリシーのテストもCIで実施
• 本日の内容は、下記のブログでも紹介しています https://engineering.mercari.com/blog/entry/introduce_conftest/